home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / v cisle / robocopy / rktools.exe / RCDATA / CABINET / rktools.msi / clean.vbs < prev    next >
Text File  |  2003-04-18  |  17KB  |  738 lines

  1. '----------------------------------------------------------------------
  2. '
  3. ' Copyright (c) Microsoft Corporation 1998-2003
  4. ' All Rights Reserved
  5. '
  6. ' clean.vbs - delete all printing components from the specified
  7. '             machine, as if the machine were clean installed.
  8. '
  9. ' Usage:
  10. ' clean [-afpdb?] [-c \\server]
  11. '
  12. ' Examples:
  13. '
  14. '----------------------------------------------------------------------
  15.  
  16. option explicit
  17.  
  18. '
  19. ' Debugging trace flags, to enable debug output trace message
  20. ' change gDebugFlag to true.
  21. '
  22. const kDebugTrace = 1
  23. const kDebugError = 2
  24. dim gDebugFlag
  25.  
  26. gDebugFlag = false
  27.  
  28. '
  29. ' Messages to be displayed if the scripting host is not cscript
  30. '
  31. const kMessage1 = "Please run this script using CScript."
  32. const kMessage2 = "This can be achieved by"
  33. const kMessage3 = "1. Using ""CScript script.vbs arguments"" or"
  34. const kMessage4 = "2. Changing the default Windows Scripting Host to CScript"
  35. const kMessage5 = "   using ""CScript //H:CScript //S"" and running the script "
  36. const kMessage6 = "   ""script.vbs arguments""."
  37.  
  38. '
  39. ' Operation action values.
  40. '
  41. const kActionUnknown    = 0
  42. const kActionAll        = 1
  43. const kActionForms      = 2
  44. const kActionPorts      = 3
  45. const kActionDrivers    = 4
  46. const kActionPrinters   = 5
  47.  
  48. '
  49. ' General error values
  50. '
  51. const kErrorSuccess     = 0
  52. const kErrorFailure     = 1
  53.  
  54. '
  55. ' Constant printer attribute local
  56. '
  57. const kLocalPrinterFlag = 64
  58.  
  59. '
  60. ' Constant local port
  61. '
  62. const kLocal = 3
  63.  
  64. '
  65. '  Search patterns used in the regular expressions
  66. '  to skip COMx: and LPTx: ports
  67. '
  68. const kComPortPattern   = "^COM\d+:$"
  69. const kLptPortPattern   = "^LPT\d+:$"
  70.  
  71. main
  72.  
  73. '
  74. ' Main execution starts here
  75. '
  76. sub main
  77.  
  78.     dim iAction
  79.     dim iRetval
  80.     dim strServer
  81.     dim bVerbose
  82.  
  83.     '
  84.     ' Abort if the host is not cscript
  85.     '
  86.     if not IsHostCscript() then
  87.  
  88.         call wscript.echo(kMessage1 & vbCRLF & kMessage2 & vbCRLF & _
  89.                           kMessage3 & vbCRLF & kMessage4 & vbCRLF & _
  90.                           kMessage5 & vbCRLF & kMessage6 & vbCRLF)
  91.  
  92.         wscript.quit
  93.  
  94.     end if
  95.  
  96.     iRetval = ParseCommandLine(iAction, strServer, bVerbose)
  97.  
  98.     if iRetval = kErrorSuccess then
  99.  
  100.         select case iAction
  101.  
  102.             case kActionAll
  103.                 iRetval = CleanAll(strServer, bVerbose)
  104.  
  105.             case kActionForms
  106.                 iRetval = CleanForms(strServer, bVerbose)
  107.  
  108.             case kActionPorts
  109.                 iRetval = CleanPorts(strServer, bVerbose)
  110.  
  111.             case kActionDrivers
  112.                 iRetval = CleanDrivers(strServer, bVerbose)
  113.  
  114.             case kActionPrinters
  115.                 iRetval = CleanPrinters(strServer, bVerbose)
  116.  
  117.             case else
  118.                 Usage(true)
  119.  
  120.         end select
  121.  
  122.     end if
  123.  
  124. end sub
  125.  
  126. '
  127. ' General function for deleting printing objects
  128. '
  129. function CleanAll(strServer, bVerbose)
  130.  
  131.     on error resume next
  132.  
  133.     DebugPrint kDebugTrace, "In the CleanAll function"
  134.  
  135.     dim iRetval
  136.  
  137.     iRetval = CleanPrinters(strServer, bVerbose)
  138.     iRetval = CleanPorts(strServer, bVerbose)
  139.     iRetval = CleanDrivers(strServer, bVerbose)
  140.     iRetval = CleanForms(strServer, bVerbose)
  141.  
  142.     CleanAll = kErrorSucces
  143.  
  144. end function
  145.  
  146. '
  147. ' Clean all forms
  148. '
  149. function CleanForms(strServer, bVerbose)
  150.  
  151.     on error resume next
  152.  
  153.     DebugPrint kDebugTrace, "In the CleanForms function"
  154.  
  155.     dim oMaster
  156.     dim oForm
  157.     dim iCount
  158.     dim iTotal
  159.  
  160.     '
  161.     ' Number of forms found
  162.     '
  163.     iTotal = 0
  164.  
  165.     '
  166.     ' Number of forms deleted
  167.     '
  168.     iCount = 0
  169.  
  170.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  171.  
  172.     for each oForm in oMaster.Forms(strServer)
  173.  
  174.         if Err.Number = kErrorSuccess then
  175.  
  176.             '
  177.             ' Tally the total number of forms.
  178.             '
  179.             iTotal = iTotal + 1
  180.  
  181.             '
  182.             ' Delete the form
  183.             '
  184.             oMaster.FormDel oForm
  185.  
  186.             if Err.Number = kErrorSuccess then
  187.  
  188.                 '
  189.                 ' Count the number of forms that were deleted
  190.                 '
  191.                 iCount = iCount + 1
  192.  
  193.             else
  194.  
  195.                 if bVerbose then
  196.  
  197.                     wscript.echo "Error deleting form " & oForm.Name & ", error: 0x" _
  198.                                  & Hex(Err.Number) & ". " & Err.Description
  199.  
  200.                 end if
  201.  
  202.             end if
  203.  
  204.             '
  205.             ' Clear the previous error code after each iteration
  206.             '
  207.             Err.Clear
  208.  
  209.         else
  210.  
  211.             wscript.echo "Unable to enumerate forms, error: 0x" & _
  212.                          Hex(Err.Number) & ". " & Err.Description
  213.  
  214.             CleanForms = kErrorFailure
  215.  
  216.             exit function
  217.  
  218.         end if
  219.  
  220.     next
  221.  
  222.     wscript.echo "Number of forms found " & iTotal & ". Forms deleted " & iCount
  223.  
  224.     CleanForms = kErrorSuccess
  225.  
  226. end function
  227.  
  228. '
  229. ' Clean all ports
  230. '
  231. function CleanPorts(strServer, bVerbose)
  232.  
  233.     on error resume next
  234.  
  235.     DebugPrint kDebugTrace, "In the CleanPorts function"
  236.  
  237.     dim oMaster
  238.     dim oPort
  239.     dim iCount
  240.     dim iTotal
  241.  
  242.     '
  243.     ' Number of ports found
  244.     '
  245.     iTotal = 0
  246.  
  247.     '
  248.     ' Number of ports deleted
  249.     '
  250.     iCount = 0
  251.  
  252.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  253.  
  254.     for each oPort in oMaster.Ports(strServer)
  255.  
  256.         if Err.Number = kErrorSuccess then
  257.  
  258.             '
  259.             ' Tally the total number of ports.
  260.             '
  261.             iTotal = iTotal + 1
  262.  
  263.             '
  264.             ' Do not delete LPTx:, COMx:, FILE: or NUL ports
  265.             '
  266.             if  oPort.PortType         =  kLocal                       and _
  267.               ( bFindPattern(kComPortPattern, oPort.PortName) = true    or _
  268.                 bFindPattern(kLptPortPattern, oPort.PortName) = true    or _
  269.                 oPort.PortName = "FILE:"                                or _
  270.                 oPort.PortName = "NUL") then
  271.  
  272.                 if bVerbose then
  273.  
  274.                     wscript.echo "Skiping port " & oPort.PortName
  275.  
  276.                 end if
  277.  
  278.             else
  279.  
  280.                 '
  281.                 ' Delete the port
  282.                 '
  283.                 oMaster.PortDel oPort
  284.  
  285.                 if Err.Number = kErrorSuccess then
  286.  
  287.                     '
  288.                     ' Count the number of ports that were deleted.
  289.                     '
  290.                     iCount = iCount + 1
  291.  
  292.                     if bVerbose then
  293.  
  294.                         wscript.echo "Deleted port " & oPort.PortName
  295.  
  296.                     end if
  297.  
  298.                 else
  299.  
  300.                     if bVerbose then
  301.  
  302.                         wscript.echo "Error deleting port " & oPort.PortName & ", error: 0x" _
  303.                                      & Hex(Err.Number) & ". " & Err.Description
  304.  
  305.                     end if
  306.  
  307.                 end if
  308.  
  309.             end if
  310.  
  311.             Err.Clear
  312.  
  313.         else
  314.  
  315.             wscript.echo "Unable to enumerate ports, error: 0x" & _
  316.                          Hex(Err.Number) & ". " & Err.Description
  317.  
  318.             CleanPorts = kErrorFailure
  319.  
  320.             exit function
  321.  
  322.         end if
  323.  
  324.     next
  325.  
  326.     wscript.echo "Number of ports found " & iTotal & ". Ports deleted " & iCount
  327.  
  328.     CleanPorts = kErrorSuccess
  329.  
  330. end function
  331.  
  332. '
  333. ' Clean all drivers
  334. '
  335. function CleanDrivers(strServer, bVerbose)
  336.  
  337.     on error resume next
  338.  
  339.     DebugPrint kDebugTrace, "In the CleanDrivers function"
  340.  
  341.     dim oMaster
  342.     dim oDriver
  343.     dim iCount
  344.     dim iTotal
  345.  
  346.     '
  347.     ' Number of drivers found
  348.     '
  349.     iTotal = 0
  350.  
  351.     '
  352.     ' Number of drivers deleted
  353.     '
  354.     iCount = 0
  355.  
  356.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  357.  
  358.     for each oDriver in oMaster.Drivers(strServer)
  359.  
  360.         if Err.Number = kErrorSuccess then
  361.  
  362.             '
  363.             ' Tally the total number of drivers.
  364.             '
  365.             iTotal = iTotal + 1
  366.  
  367.             '
  368.             ' Delete the driver
  369.             '
  370.             oMaster.DriverDel oDriver
  371.  
  372.             if Err.Number = kErrorSuccess then
  373.  
  374.                 '
  375.                 ' Count the number of drivers that were deleted.
  376.                 '
  377.                 iCount = iCount + 1
  378.  
  379.                 if bVerbose then
  380.  
  381.                     wscript.echo "Deleted driver " & oDriver.ModelName
  382.  
  383.                 end if
  384.  
  385.             else
  386.  
  387.                 if bVerbose then
  388.  
  389.                     wscript.echo "Error deleting driver " & oDriver.ModelName & _
  390.                                  ", error: 0x" & Hex(Err.Number) & ". " & Err.Description
  391.  
  392.                 end if
  393.  
  394.             end if
  395.  
  396.             Err.Clear
  397.  
  398.         else
  399.  
  400.             wscript.echo "Unable to enumerate drivers, error: 0x" & _
  401.                          Hex(Err.Number) & ". " & Err.Description
  402.  
  403.             CleanDrivers = kErrorFailure
  404.  
  405.             exit function
  406.  
  407.         end if
  408.  
  409.     next
  410.  
  411.     wscript.echo "Number of drivers found " & iTotal & ". Drivers deleted " & iCount
  412.  
  413.     CleanDrivers = kErrorSuccess
  414.  
  415. end function
  416.  
  417. '
  418. ' Clean all printers
  419. '
  420. function CleanPrinters(strServer, bVerbose)
  421.  
  422.     on error resume next
  423.  
  424.     DebugPrint kDebugTrace, "In the CleanPrinters function"
  425.     dim oMaster
  426.     dim oPrinter
  427.     dim iCount
  428.     dim iTotal
  429.  
  430.     '
  431.     ' Number of printers found
  432.     '
  433.     iTotal = 0
  434.  
  435.     '
  436.     ' Number of printers deleted
  437.     '
  438.     iCount = 0
  439.  
  440.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  441.  
  442.     for each oPrinter in oMaster.Printers(strServer)
  443.  
  444.         if Err.Number = kErrorSuccess then
  445.  
  446.             '
  447.             ' Tally the total number of printers.
  448.             '
  449.             iTotal = iTotal + 1
  450.  
  451.             '
  452.             ' When we enumerate printers on a remote machine, they will
  453.             ' all have the attribute set to Network, not to local. When
  454.             ' we enumerate printers on the local machine, connections have
  455.             ' the attribute network. This is the reason why we need to know
  456.             ' whether we enumerate on a  remote machine or on the local one
  457.             ' Remark: if strServer is not empty, no connections will be
  458.             ' enumerated
  459.             '
  460.  
  461.             if strServer = "" then
  462.  
  463.                 if (oPrinter.Attributes and kLocalPrinterFlag) = kLocalPrinterFlag then
  464.  
  465.                     DebugPrint kDebugTrace, "Deleting local printer " & oPrinter.PrinterName
  466.  
  467.                     '
  468.                     ' Purge the printer
  469.                     '
  470.                     oMaster.PrinterPurge strServer, oPrinter.PrinterName
  471.  
  472.                     '
  473.                     ' Sometimes we can delete a printer, but we cannot purge it
  474.                     ' We need to clear the error in this case
  475.                     '
  476.                     Err.Clear
  477.  
  478.                     oMaster.PrinterDel oPrinter
  479.  
  480.                 else
  481.  
  482.                     DebugPrint kDebugTrace, "Deleting printer connection" & oPrinter.PrinterName
  483.  
  484.                     oMaster.PrinterConnectionDel oPrinter.PrinterName
  485.  
  486.                 end if
  487.  
  488.             else
  489.  
  490.                 '
  491.                 ' Purge the printer, it is a local printer on a remote machine
  492.                 '
  493.                 oMaster.PrinterPurge strServer, oPrinter.PrinterName
  494.  
  495.                 '
  496.                 ' In some cases, we can delete a printer, but not purge it
  497.                 ' We need to clear the error
  498.                 '
  499.                 Err.Clear
  500.  
  501.                 oPrinter.ServerName = strServer
  502.  
  503.                 oMaster.PrinterDel oPrinter
  504.  
  505.             end if
  506.  
  507.             if Err.Number = kErrorSuccess then
  508.  
  509.                 '
  510.                 ' Count the number of printers that were deleted.
  511.                 '
  512.                 iCount = iCount + 1
  513.  
  514.                 if bVerbose then
  515.  
  516.                     wscript.echo "Deleted printer " & oPrinter.PrinterName
  517.  
  518.                 end if
  519.  
  520.             else
  521.  
  522.                 if bVerbose then
  523.  
  524.                     wscript.echo "Error deleting printer " & oPrinter.PrinterName & _
  525.                                  ", error: 0x" & Hex(Err.Number) & ". " & Err.Description
  526.  
  527.                 end if
  528.  
  529.             end if
  530.  
  531.             Err.Clear
  532.  
  533.         else
  534.  
  535.             wscript.echo "Unable to enumerate printers, error: 0x" & _
  536.                          Hex(Err.Number) & ". " & Err.Description
  537.  
  538.             CleanPrinters = kErrorFailure
  539.  
  540.             exit function
  541.  
  542.         end if
  543.  
  544.     next
  545.  
  546.     wscript.echo "Number of printers found " & iTotal & ". Printers deleted " & iCount
  547.  
  548.     CleanPrinters = kErrorSuccess
  549.  
  550. end function
  551.  
  552. '
  553. ' Resolve the regular expression
  554. '
  555. function bFindPattern(strPattern, strString)
  556.  
  557.     dim RegEx                            ' Create variable.
  558.     set RegEx = New RegExp               ' Create regular expression.
  559.     RegEx.Pattern = strPattern           ' Set pattern.
  560.     RegEx.IgnoreCase = true              ' Set case insensitivity.
  561.     bFindPattern = RegEx.Test(strString) ' Test if pattern is found.
  562.  
  563. end function
  564.  
  565. '
  566. ' Debug display helper function
  567. '
  568. sub DebugPrint(uFlags, strString)
  569.  
  570.     if gDebugFlag = true then
  571.  
  572.         if uFlags = kDebugTrace then
  573.  
  574.             wscript.echo "Debug: " & strString
  575.  
  576.         end if
  577.  
  578.         if uFlags = kDebugError then
  579.  
  580.             if Err <> 0 then
  581.  
  582.                 wscript.echo "Debug: " & strString & " Failed with " & Hex(Err)
  583.  
  584.             end if
  585.  
  586.         end if
  587.  
  588.     end if
  589.  
  590. end sub
  591.  
  592. '
  593. ' Parse the command line into it's components
  594. '
  595. function ParseCommandLine(iAction, strServer, bVerbose)
  596.  
  597.     on error resume next
  598.  
  599.     DebugPrint kDebugTrace, "In the ParseCommandLine"
  600.  
  601.     dim oArgs
  602.     dim i
  603.  
  604.     iAction = kActionUnknown
  605.  
  606.     set oArgs = wscript.Arguments
  607.  
  608.     while i < oArgs.Count
  609.  
  610.         select case oArgs(i)
  611.  
  612.             case "-a"
  613.                 iAction = kActionAll
  614.  
  615.             case "-f"
  616.                 iAction = kActionForms
  617.  
  618.             case "-p"
  619.                 iAction = kActionPorts
  620.  
  621.             case "-d"
  622.                 iAction = kActionDrivers
  623.  
  624.             case "-b"
  625.                 iAction = kActionPrinters
  626.  
  627.             case "-c"
  628.                 i = i + 1
  629.                 strServer = oArgs(i)
  630.  
  631.             case "-v"
  632.                 bVerbose = true
  633.  
  634.             case "-?"
  635.                 Usage(true)
  636.  
  637.             case else
  638.                 Usage(true)
  639.  
  640.         end select
  641.  
  642.         i = i + 1
  643.  
  644.     wend
  645.  
  646.     if Err.Number = kErrorSuccess then
  647.  
  648.         ParseCommandLine = kErrorSuccess
  649.  
  650.     else
  651.  
  652.         wscript.echo "Unable to parse command line, error: 0x" & _
  653.                      Hex(Err.Number) & ". " & Err.Description
  654.  
  655.         ParseCommandLine = kErrorFailure
  656.  
  657.     end if
  658.  
  659. end  function
  660.  
  661. '
  662. ' Display command usage.
  663. '
  664. sub Usage(bExit)
  665.  
  666.     wscript.echo "Usage: clean [-afpdbv?] [-c server]"
  667.     wscript.echo "Arguments:"
  668.     wscript.echo "-a     - clean all, printers, ports, drivers, forms"
  669.     wscript.echo "-f     - clean forms"
  670.     wscript.echo "-p     - clean ports"
  671.     wscript.echo "-b     - clean printers"
  672.     wscript.echo "-d     - clean drivers"
  673.     wscript.echo "-v     - verbose display progress and error information"
  674.     wscript.echo "-c     - server name"
  675.     wscript.echo ""
  676.     wscript.echo "Examples:"
  677.     wscript.echo "clean -a"
  678.     wscript.echo "clean -a -c \\server"
  679.     wscript.echo "clean -v -f -c \\server"
  680.  
  681.     if bExit then
  682.  
  683.         wscript.quit(1)
  684.  
  685.     end if
  686.  
  687. end sub
  688.  
  689. '
  690. ' Determines which program is used to run this script.
  691. ' Returns true if the script host is cscript.exe
  692. '
  693. function IsHostCscript()
  694.  
  695.     on error resume next
  696.  
  697.     dim strFullName
  698.     dim strCommand
  699.     dim i, j
  700.     dim bReturn
  701.  
  702.     bReturn = false
  703.  
  704.     strFullName = WScript.FullName
  705.  
  706.     i = InStr(1, strFullName, ".exe", 1)
  707.  
  708.     if i <> 0 then
  709.  
  710.         j = InStrRev(strFullName, "\", i, 1)
  711.  
  712.         if j <> 0 then
  713.  
  714.             strCommand = Mid(strFullName, j+1, i-j-1)
  715.  
  716.             if LCase(strCommand) = "cscript" then
  717.  
  718.                 bReturn = true
  719.  
  720.             end if
  721.  
  722.         end if
  723.  
  724.     end if
  725.  
  726.     if Err <> 0 then
  727.  
  728.         call wscript.echo("Error 0x" & hex(Err.Number) & " occurred. " & Err.Description _
  729.                           & ". " & vbCRLF & "The scripting host could not be determined.")
  730.  
  731.     end if
  732.  
  733.     IsHostCscript = bReturn
  734.  
  735. end function
  736.  
  737.  
  738.